Несмотря на огромные вложения в рекламу, последние несколько месяцев компания терпит убытки. Необходимо разобраться в причинах и помочь компании выйти в плюс. В нашем распоряжении данные о пользователях, привлечённых с 1 мая по 27 октября 2019 года:
В ходе исследование были разобраны следующие вопросы:
Посмотрим на датасеты и информацию о типах данных по каждой из импортируемых csv-файлов и подготовим их к анализу. Начнем с данных о визитах
| User Id | Region | Device | Channel | Session Start | Session End | |
|---|---|---|---|---|---|---|
| 0 | 981449118918 | United States | iPhone | organic | 2019-05-01 02:36:01 | 2019-05-01 02:45:01 |
| 1 | 278965908054 | United States | iPhone | organic | 2019-05-01 04:46:31 | 2019-05-01 04:47:35 |
| 2 | 590706206550 | United States | Mac | organic | 2019-05-01 14:09:25 | 2019-05-01 15:32:08 |
| 3 | 326433527971 | United States | Android | TipTop | 2019-05-01 00:29:59 | 2019-05-01 00:54:25 |
| 4 | 349773784594 | United States | Mac | organic | 2019-05-01 03:33:35 | 2019-05-01 03:57:40 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 309901 entries, 0 to 309900 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 User Id 309901 non-null int64 1 Region 309901 non-null object 2 Device 309901 non-null object 3 Channel 309901 non-null object 4 Session Start 309901 non-null object 5 Session End 309901 non-null object dtypes: int64(1), object(5) memory usage: 14.2+ MB
Для удобства и в соответствии с правилами хорошего тона поменяем название столбцов.
Index(['User Id', 'Region', 'Device', 'Channel', 'Session Start',
'Session End'],
dtype='object')
Index(['user_id', 'region', 'device', 'channel', 'session_start',
'session_end'],
dtype='object')
Столбцы user_id, region, device и channel соответствуют своему типу данных. В столбцах session_start и session_end содержатся даты. Приведем их к типу данных datetime.
<class 'pandas.core.frame.DataFrame'> RangeIndex: 309901 entries, 0 to 309900 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 user_id 309901 non-null int64 1 region 309901 non-null object 2 device 309901 non-null object 3 channel 309901 non-null object 4 session_start 309901 non-null datetime64[ns] 5 session_end 309901 non-null datetime64[ns] dtypes: datetime64[ns](2), int64(1), object(3) memory usage: 14.2+ MB
Проверим колонки на наличие пропущенных значений и дубликатов
Колонок с пропущенным значением: 0 Количество явных дубликатов: 0
array(['United States', 'UK', 'France', 'Germany'], dtype=object)
array(['iPhone', 'Mac', 'Android', 'PC'], dtype=object)
array(['organic', 'TipTop', 'RocketSuperAds', 'YRabbit', 'FaceBoom',
'MediaTornado', 'AdNonSense', 'LeapBob', 'WahooNetBanner',
'OppleCreativeMedia', 'lambdaMediaAds'], dtype=object)
Пропущенных значений и явных дубликатов не обнаружено. Среди уникальных значений столбцов region, device и channel неявных дубликатов так же нет.
Проверим данные о заказах
| User Id | Event Dt | Revenue | |
|---|---|---|---|
| 0 | 188246423999 | 2019-05-01 23:09:52 | 4.99 |
| 1 | 174361394180 | 2019-05-01 12:24:04 | 4.99 |
| 2 | 529610067795 | 2019-05-01 11:34:04 | 4.99 |
| 3 | 319939546352 | 2019-05-01 15:34:40 | 4.99 |
| 4 | 366000285810 | 2019-05-01 13:59:51 | 4.99 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 40212 entries, 0 to 40211 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 User Id 40212 non-null int64 1 Event Dt 40212 non-null object 2 Revenue 40212 non-null float64 dtypes: float64(1), int64(1), object(1) memory usage: 942.6+ KB
Для удобства и в соответствии с правилами хорошего тона поменяем название столбцов.
Index(['User Id', 'Event Dt', 'Revenue'], dtype='object')
Index(['user_id', 'event_dt', 'revenue'], dtype='object')
В столбце event_dt содержатся даты. Приведем его к типу данных datetime.
<class 'pandas.core.frame.DataFrame'> RangeIndex: 40212 entries, 0 to 40211 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 user_id 40212 non-null int64 1 event_dt 40212 non-null datetime64[ns] 2 revenue 40212 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(1) memory usage: 942.6 KB
Проверим колонки на наличие пропущенных значений и дубликатов
Колонок с пропущенным значением: 0 Количество явных дубликатов: 0
Пропущенных значений и явных дубликатов не обнаружено.
Проверим последнюю таблицу, с данными о расходах
| dt | Channel | costs | |
|---|---|---|---|
| 0 | 2019-05-01 | FaceBoom | 113.3 |
| 1 | 2019-05-02 | FaceBoom | 78.1 |
| 2 | 2019-05-03 | FaceBoom | 85.8 |
| 3 | 2019-05-04 | FaceBoom | 136.4 |
| 4 | 2019-05-05 | FaceBoom | 122.1 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1800 entries, 0 to 1799 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 dt 1800 non-null object 1 Channel 1800 non-null object 2 costs 1800 non-null float64 dtypes: float64(1), object(2) memory usage: 42.3+ KB
Для удобства и в соответствии с правилами хорошего тона поменяем название столбца Channel.
Index(['dt', 'channel', 'costs'], dtype='object')
В столбце dt содержатся даты. Приведем его к типу данных datetime.
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1800 entries, 0 to 1799 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 dt 1800 non-null object 1 channel 1800 non-null object 2 costs 1800 non-null float64 dtypes: float64(1), object(2) memory usage: 42.3+ KB
Проверим колонки на наличие пропущенных значений и дубликатов
Колонок с пропущенным значением: 0 Количество явных дубликатов: 0
array(['FaceBoom', 'MediaTornado', 'RocketSuperAds', 'TipTop', 'YRabbit',
'AdNonSense', 'LeapBob', 'OppleCreativeMedia', 'WahooNetBanner',
'lambdaMediaAds'], dtype=object)
Пропущенных значений и явных дубликатов не обнаружено. В колонке сhannel неявные дубликаты отсутствуют.
Так же для готовых функций нам понадобиться переменная User. За основу берем датасет с визитами
В целях маркетингового анализа зададим функции, которые помогут нам с оценкой окупаемости рекламного бюджета по источникам, странам и каналам, а так же наглядно визуализируют полученные данные
Функция для создания профилей пользователей:
Функция для подсчёта Retention Rate:
Функция для подсчёта конверсии:
Функция для подсчёта LTV и ROI:
Функция для сглаживания датафрейма:
Функция для построения графика Retention Rate:
Функция для построения графика конверсии:
Функция для для визуализации LTV и ROI:
Функции заданы. Переходим к исследованию
| user_id | first_ts | channel | device | region | dt | month | payer | acquisition_cost | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 599326 | 2019-05-07 20:58:57 | FaceBoom | Mac | United States | 2019-05-07 | 2019-05-01 | True | 1.088172 |
| 1 | 4919697 | 2019-07-09 12:46:07 | FaceBoom | iPhone | United States | 2019-07-09 | 2019-07-01 | False | 1.107237 |
| 2 | 6085896 | 2019-10-01 09:58:33 | organic | iPhone | France | 2019-10-01 | 2019-10-01 | False | 0.000000 |
| 3 | 22593348 | 2019-08-22 21:35:48 | AdNonSense | PC | Germany | 2019-08-22 | 2019-08-01 | False | 0.988235 |
| 4 | 31989216 | 2019-10-02 00:07:44 | YRabbit | iPhone | United States | 2019-10-02 | 2019-10-01 | False | 0.230769 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 150003 | 999956196527 | 2019-09-28 08:33:02 | TipTop | iPhone | United States | 2019-09-28 | 2019-09-01 | False | 3.500000 |
| 150004 | 999975439887 | 2019-10-21 00:35:17 | organic | PC | UK | 2019-10-21 | 2019-10-01 | False | 0.000000 |
| 150005 | 999976332130 | 2019-07-23 02:57:06 | TipTop | iPhone | United States | 2019-07-23 | 2019-07-01 | False | 2.600000 |
| 150006 | 999979924135 | 2019-09-28 21:28:09 | MediaTornado | PC | United States | 2019-09-28 | 2019-09-01 | False | 0.205714 |
| 150007 | 999999563947 | 2019-10-18 19:57:25 | organic | iPhone | United States | 2019-10-18 | 2019-10-01 | False | 0.000000 |
150008 rows × 9 columns
Самая ранняя дата привлечения пользователей 2019-05-01 00:00:41 Самая поздняя дата привлечения пользователей 2019-10-27 23:59:04
Результат — 150008 пользовательских профилей, в каждом из которых есть данные о дате первого посещения и рекламном источнике. Так как мы работаем с данными от 1 мая по 27 октября 2019 года, можно сказать что пользовательский поток идет стабильно и за изучайный период первый пользователь появился на первой минуте самой ранней даты, а последний за минуту до конца изучаемого периода.
| total_users | payers | payers_rate | |
|---|---|---|---|
| region | |||
| United States | 100002 | 6902 | 0.069019 |
| Germany | 14981 | 616 | 0.041119 |
| UK | 17575 | 700 | 0.039829 |
| France | 17450 | 663 | 0.037994 |
Вывод по регионам:
| total_users | payers | payers_rate | |
|---|---|---|---|
| device | |||
| Mac | 30042 | 1912 | 0.063644 |
| iPhone | 54479 | 3382 | 0.062079 |
| Android | 35032 | 2050 | 0.058518 |
| PC | 30455 | 1537 | 0.050468 |
Вывод по устройствам:
Дополнительно посмотрим на разбивку по Регионам
| region | device | France | Germany | UK | United States |
|---|---|---|---|---|---|
| 0 | Android | 5252 | 4440 | 5141 | 20199 |
| 1 | Mac | 1838 | 1584 | 1778 | 24842 |
| 2 | PC | 6940 | 5945 | 7138 | 10432 |
| 3 | iPhone | 3420 | 3012 | 3518 | 44529 |
Вывод по распределению пользоватей по устроиствам и регионам:
| total_users | payers | payers_rate | |
|---|---|---|---|
| channel | |||
| FaceBoom | 29144 | 3557 | 0.122049 |
| AdNonSense | 3880 | 440 | 0.113402 |
| lambdaMediaAds | 2149 | 225 | 0.104700 |
| TipTop | 19561 | 1878 | 0.096007 |
| RocketSuperAds | 4448 | 352 | 0.079137 |
Вывод по рекламным источникам:
Посмотрим распределение рекламных каналов по регионам
| region | channel | France | Germany | UK | United States |
|---|---|---|---|---|---|
| 7 | WahooNetBanner | 152.0 | 148.0 | 153.0 | NaN |
| 0 | AdNonSense | 150.0 | 142.0 | 148.0 | NaN |
| 2 | LeapBob | 90.0 | 69.0 | 103.0 | NaN |
| 9 | lambdaMediaAds | 82.0 | 67.0 | 76.0 | NaN |
| 4 | OppleCreativeMedia | 80.0 | 64.0 | 89.0 | NaN |
| 1 | FaceBoom | NaN | NaN | NaN | 3557.0 |
| 3 | MediaTornado | NaN | NaN | NaN | 156.0 |
| 5 | RocketSuperAds | NaN | NaN | NaN | 352.0 |
| 6 | TipTop | NaN | NaN | NaN | 1878.0 |
| 8 | YRabbit | NaN | NaN | NaN | 165.0 |
Среди 10 рекламных каналов 5 работают только на Европейской территории и 5 только на территории США
Пользовательский портрет понятен. Теперь можно разобрать расходы на маркетинг
Посчитаем общую сумму расходов на маркетинг
Общая сумма затрат на маркетинг: 105497.30000000002
Посмотрим как траты распределены по рекламным источникам (сколько денег потратили на каждый источник).
| costs | |
|---|---|
| channel | |
| TipTop | 54751.30 |
| FaceBoom | 32445.60 |
| WahooNetBanner | 5151.00 |
| AdNonSense | 3911.25 |
| OppleCreativeMedia | 2151.25 |
| RocketSuperAds | 1833.00 |
| LeapBob | 1797.60 |
| lambdaMediaAds | 1557.60 |
| MediaTornado | 954.48 |
| YRabbit | 944.22 |
Львиная доля бюджета (почти 50%) на маркетинг была выделена в TipTop. Вторым по значимости вложений стал FaceBoom (30% бюджета). Стоит отметить что эти два канала показывают рекламу только в США, соответственно почти 80% бюджета оседает на рекламном рынке Америки.
Посмотри мна распределени бюджета относительно месяца и недели:
Вывод по месечным затратам:
Text(0.5, 1.0, 'Затраты на маркетинг по неделям')
Вывод по недельным затратам:
| cac | |
|---|---|
| channel | |
| TipTop | 2.799003 |
| FaceBoom | 1.113286 |
| AdNonSense | 1.008054 |
| lambdaMediaAds | 0.724802 |
| WahooNetBanner | 0.602245 |
| RocketSuperAds | 0.412095 |
| OppleCreativeMedia | 0.250000 |
| YRabbit | 0.218975 |
| MediaTornado | 0.218717 |
| LeapBob | 0.210172 |
| organic | 0.000000 |
| cac | |
|---|---|
| channel | |
| TipTop | 2.799003 |
| FaceBoom | 1.113286 |
| AdNonSense | 1.008054 |
| lambdaMediaAds | 0.724802 |
| WahooNetBanner | 0.602245 |
| RocketSuperAds | 0.412095 |
| OppleCreativeMedia | 0.250000 |
| YRabbit | 0.218975 |
| MediaTornado | 0.218717 |
| LeapBob | 0.210172 |
| organic | 0.000000 |
Вывод по CAC (каналы):
| cac | |
|---|---|
| region | |
| United States | 0.909268 |
| Germany | 0.295322 |
| France | 0.290887 |
| UK | 0.288393 |
Вывод по CAC (регион):
| cac | |
|---|---|
| month | |
| 2019-10-01 | 0.861699 |
| 2019-09-01 | 0.852408 |
| 2019-08-01 | 0.777021 |
| 2019-07-01 | 0.726878 |
| 2019-06-01 | 0.652599 |
| 2019-05-01 | 0.368064 |
Вывод по CAC (по месяцам):
Проверим окупаются ли привлеченные пользователи за 2 недели. Поскольку мы имеем дело с бюджетом на рекламу, органических пользователей следует исключить - они нам ничего не стоили.
Вывод по окупаемости рекламы:
Коверсия плавно поднимается до 10го дня и после остается в районе 0,08. Динамика конверсии показывает хороший приход платильщиков в середине июня, стабильный с начала июля и до его середины. Самым слабым периодом оказался середина мая.
Рассмотрим конверсию по регионам и устройствам.
Лучше всего конверсию показывают Mac и iPhone, которыми пользуюся в США. Самая низкая конверсия у пользователей PC.
Ожидаемо конверсия пользователей из США Сильно превосходит Европейских. Динамика же показывает что на старте изучаемого периода позьзователи Франции, Германии и Великобритании по конверсии были на уровне США, и даже превосходили их показатели. После июня Европа больше не показывала высокой конверсии, за исключением вспышки в середине августа на территории Великобритании.
Лидером по конверсии стал FaceBoom. В тройку так же попали AdNonSense и LambdaMediaAds. В динамике хорошую, но не постоянную конверсию показывает LambdaMediaAds (за отличительными пиковыми показателями, следуют такие же отличительные спады). Хуже всего конверсия идет в OppleCreativeMedia
Вывод по конверсии:
Платящие пользователи остаются в приложении ожидаемо дольше. Неплатящие теряют интерес на восьмой день. Динамику платящих достаточно сильно штормит, достигая порой нулевые значения.
Посмотрим удержание по устройствам и регонам
PC и Android, которые плохо конвертировались, показывают достаточно хорошие показатели удержания платных пользователей. В динамике пользователи iPhone не превышают показателя в 0,3, в то время как пиковые значения PC подбираются к 0,7
Платящие Европейцы удерживаются гораздо лучше чем американцы. В динамике удержание на 14й день Франции, Германии и Великобритании порой достигает единицы, тогда как в США пиковое значение находится в районе 0,3
Лидеры по конверсии FaceBoom и AdNonSense оказались аутсайдерами по удержанию. Остальные 8 каналов примерно в одном и том же диапазоне значений.
Вывод по удержанию:
Вывод по окупаемости рекламы по устроиствам:
Вывод по окупаемости рекламы по странам:
Вывод по окупаемости рекламы по каналам (Совокупно):
Вывод по окупаемости рекламы по каналам (Совокупно):
Вывод по окупаемости рекламы по каналам (Европа):
В нашем распоряжении были данные о пользователях развлекательного приложения Procrastinate Pro+, привлечённых с 1 мая по 27 октября 2019 года. Задача - разобраться в причинах убытков и помочь компании в выборе рекламной стратегии и рекламных каналах.
Для этого данные были приведны в "рабочее" состоянии, проверены на дубликаты и пропуски. Помимо этого перед началом исследования были заданы функции, которые составили портрет пользователей, конверсию и удержание, а так же упростили оценку окупаемости рекламного бюджета по источникам, странам и каналам, и помогли наглядно визуализируют полученные данные.
Из портрета пользователей было выяснено следующее:
Маркетинг в исследлуемый период задействовал 10 рекламных каналов. Из них 5 работают только на Европейской территории и 5 только на территории США. Всего на маркетинг было потрачено 105 497 у.е.
Львиная доля бюджета (почти 50%) на маркетинг была выделена в TipTop. Вторым по значимости вложений стал FaceBoom (30% бюджета). Стоит отметить что эти два канала показывают рекламу только в США, соответственно почти 80% бюджета оседает на рекламном рынке Америки.
При рассмотрении стоимости привлечения пользователей в разрезе по месяцам заметно сильный рост цены на одного пользователя. На старте периода средний пользователь стоил 0,37 у.е., на конец перода стоимость возрасла до 0,86 у.е.
Из плюсов:
Из минусов:
Очевидно, что причина убытков - завышенные ожидания от американского рынка в целом и от TipTop в частности. Несмотря на хорошую конверсию и долю рынка прибыль это направления маркетинга не показывает. С другой стороны на небольших вложениях европейский рынок показывает не только более высокую лояльность, но и быструю окупаемость.
В качестве рекомендаций, стоит:
Благодарю за внимание!